💡 先想象一个场景:
你做了一个图书管理系统的网站。用户在浏览器输入 ISBN,网页要去数据库查这本书的信息,然后显示出来。
这中间有个问题:浏览器不会自己去查数据库 —— 必须有"中间人"。
这个中间人就是 Python 程序(或 Java、PHP 等)。它一边接收浏览器的请求,一边操作 MySQL,最后把结果返回给浏览器。
👉 本章就讲:怎么用 Python 跟 MySQL "对话"。这是 Web 开发、数据分析、爬虫等等所有数据库应用的第一步。
一、Python DB API 是什么?了解
1.1 一句话定义
Python DB API = Python 访问数据库的统一标准。所有支持它的库(连 MySQL 的、连 Oracle 的、连 SQLite 的)都按这个标准来。
结果:学会一种,其他都会。
就像 USB 接口标准:插鼠标、插键盘、插U盘,外观和用法一样,但里面是不同设备。
Python DB API 也一样 —— 用 Python 连 MySQL、Oracle、SQLite,代码套路几乎一样。
1.2 三大核心对象了解
Python DB API 提供 3 个核心对象:
Connection
跟数据库的"网络连接"。
主要方法:cursor() / commit() / rollback() / close()
Cursor(游标)
执行 SQL、获取结果的工具。
主要方法:execute() / fetchone() / fetchall() / close()
Exceptions
各种错误异常。
如 DatabaseError、OperationalError、ProgrammingError
① Connection:管"连进来 + 提交事务"
② Cursor:管"执行 SQL + 拿结果"
③ Exceptions:捕获异常时用
1.3 第三方包:mysql-connector-python必考
Python 自带的标准库不能直接连 MySQL,需要装第三方包。最官方的是 mysql-connector-python(MySQL 官方维护)。
# 用 pip 安装
pip install mysql-connector-python
装完后,在 Python 里用 import mysql.connector 就能用了。
除了 mysql-connector,还有 PyMySQL、mysqlclient 等。用法都差不多,本章用官方的 mysql-connector。
二、5 步流程:核心套路必考核心
2.1 牢记这 5 步必考
不管做什么操作(CRUD),都是这 5 步。记住这个套路,期末考试的代码题就完成一大半了。
"导 → 连 → 游 → 执 → 关"
导入接口 → 建立连接 → 创建游标 → 执行 SQL → 关闭
2.2 connect() 函数:连接参数必考
db = mysql.connector.connect(
host='主机地址', # 数据库服务器在哪
user='用户名', # 登录账号
passwd='密码', # 登录密码
database='数据库名', # 要操作哪个数据库
port=3306 # 端口号,可省略
)
5 个参数详解
| 参数 | 含义 | 常见值 |
|---|---|---|
| host | 数据库服务器地址 | 'localhost' 或 IP |
| user | 登录用户名 | 'root' |
| passwd | 登录密码 | '123456' |
| database | 要使用的数据库名 | 'teaching' |
| port | 端口号,可省略(默认 3306) | 3306 |
① 数据库 必须先存在,连接才能成功。如果是新数据库,要先在 MySQL 里 CREATE DATABASE teaching
② 密码错了、host 错了,会抛 OperationalError 异常
三、第一个完整例子:查询版本实操
3.1 完整代码 + 逐行解读
需求:连上 teaching 数据库,查询并打印 MySQL 的版本号。
# 第 1 步:导入接口
import mysql.connector
# 第 2 步:建立连接
db = mysql.connector.connect(
host='localhost',
user='root',
passwd='123456',
database='teaching'
)
# 第 3 步:创建游标
cursor = db.cursor()
# 第 4 步:执行 SQL(这里查询 MySQL 版本)
cursor.execute("SELECT VERSION()")
data = cursor.fetchone() # 取一行结果
print("Database version :", data)
# 第 5 步:关闭游标和连接
cursor.close()
db.close()
① fetchone() 返回的是元组(用括号包起来的):('8.0.23',)
② 后面的逗号 , 表明这是一个 单元素元组
③ 想拿到字符串本身,用 data[0] 取第一个元素
后面所有的 CRUD 例子,都按这 5 步写,只是第 4 步的 SQL 不一样。
四、CRUD 实战实操必考
4.1 插入数据:INSERT必考
需求:在 s 表中插入一名新学生(s9, 王天一, 女, 18, 计算机, 信息学院)。
import mysql.connector
db = mysql.connector.connect(
host='localhost', user='root',
passwd='123456', database='teaching'
)
cursor = db.cursor()
try:
cursor.execute("INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')")
db.commit() # ⭐ 重要:必须提交事务!
print("插入成功")
except:
db.rollback() # 出错就回滚
print("插入失败")
cursor.close()
db.close()
修改类操作(INSERT/UPDATE/DELETE)必须调用 db.commit(),否则数据只在缓冲区,不会真的写入数据库!
这是初学者最容易忘的,也是必考点。
修改类操作 都要用 try-except 包起来:
① try:执行 SQL + commit 提交
② except:rollback 回滚
这样保证数据一致性 —— 要么全成功,要么全失败。
4.2 修改数据:UPDATE必考
需求:把"林毅"的专业改成"计算机"。
import mysql.connector
db = mysql.connector.connect(
host='localhost', user='root',
passwd='123456', database='teaching'
)
cursor = db.cursor()
# 把 SQL 提取出来,更清晰
sql = "UPDATE s SET maj='计算机' WHERE sn='林毅'"
try:
cursor.execute(sql)
db.commit()
print("修改了", cursor.rowcount, "行") # rowcount 看影响了多少行
except:
db.rollback()
cursor.close()
db.close()
cursor.rowcount 返回 受影响的行数。可以用它判断操作是否真的改了数据。
4.3 删除数据:DELETE必考
需求:删除学号为 s12 的学生。
import mysql.connector
db = mysql.connector.connect(
host='localhost', user='root',
passwd='123456', database='teaching'
)
cursor = db.cursor()
try:
cursor.execute("DELETE FROM s WHERE sno='s12'")
db.commit()
print("删除成功")
except:
db.rollback()
cursor.close()
db.close()
三种修改操作的代码 结构完全一样,只是 SQL 不同。都要 commit,都要 try-except。
4.4 查询数据:SELECT必考
fetch 三件套
| 方法 | 作用 | 返回值 |
|---|---|---|
| fetchone() | 取 一行 | 元组 ('s1', '王彤', ...) |
| fetchall() | 取 全部行 | 元组列表 [('s1', ...), ('s2', ...)] |
| fetchmany(n) | 取 n 行 | 元组列表(最多 n 个) |
例:查询所有 age >= 20 的学生
import mysql.connector
db = mysql.connector.connect(
host='localhost', user='root',
passwd='123456', database='teaching'
)
cursor = db.cursor()
cursor.execute("SELECT * FROM s WHERE age >= 20")
results = cursor.fetchall() # 取全部
# 遍历打印
for row in results:
print(row)
cursor.close()
db.close()
SELECT 只是读取数据,不改数据,不需要调用 commit。
记住:"读不 commit,写必 commit"。
① 只想要一条结果 → 用 fetchone()(高效,不浪费内存)
② 想要全部结果 → 用 fetchall()
③ 数据量很大但只要前 N 条 → 用 fetchmany(N)
五、事务:commit 和 rollback必考
5.1 为什么要 commit?必考
这是本章最容易踩的坑,也是必考点。
Python 调用 execute() 修改数据时,修改先在缓冲区,并没有真的写入 MySQL。
必须调用 db.commit(),修改才会真的"落盘"。
① execute() = 在编辑器里打字(屏幕上看得到)
② commit() = 点"保存"按钮(真的存到硬盘)
不点保存就关掉,前面打的字全没了 —— 不 commit 也是一样。
5.2 rollback 的作用
db.rollback() = 撤销所有还没 commit 的修改,回到上一次 commit 的状态。
典型场景:批量插入时其中一条出错
不用 rollback 的话,前面已经成功的几条会留下,数据不一致。用了 rollback 全部撤销,要么全成功要么全失败。
5.3 标准模板:try-except 处理事务必考
try:
cursor.execute(sql1) # 执行 SQL
cursor.execute(sql2)
db.commit() # 全部成功 → 提交
except:
db.rollback() # 任何一个失败 → 全部回滚
例:批量插入,保证原子性
import mysql.connector
db = mysql.connector.connect(
host='localhost', user='root',
passwd='123456', database='teaching'
)
cursor = db.cursor()
sql1 = "INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')"
sql2 = "INSERT INTO s VALUES('s10','苏红霞','女',20,'信息','信息学院')"
sql3 = "INSERT INTO s VALUES('s11','林勇','男',19,'信息','信息学院')"
try:
cursor.execute(sql1)
cursor.execute(sql2)
cursor.execute(sql3)
db.commit() # 三条全部成功才 commit
print("全部插入成功")
except Exception as e:
db.rollback() # 任何一条失败,全部回滚
print("出错回滚:", e)
cursor.close()
db.close()
修改操作的"黄金套路":
① 用 try 包住 execute 和 commit
② 用 except 调用 rollback
这样能保证 原子性(要么全成,要么全败)。
这就是第 9 章学的"事务的原子性(Atomicity)"在 Python 里的实现。commit + rollback 共同保证原子性。
六、本章小结
📋 三句话总结
- Python 通过 mysql.connector 连接 MySQL,5 步流程:导 → 连 → 游 → 执 → 关。
- 修改数据(INSERT/UPDATE/DELETE)必须 commit,出错要 rollback,标配 try-except 模板。
- 查询用 fetchone(一行)/ fetchall(全部)/ fetchmany(n)(n 行),不需要 commit。
本章必考点回顾
⭐ 期末考点
- 写一段完整的 Python 连 MySQL 代码(综合大题,分值最高)
- connect() 函数的 5 个参数(填空)
- commit 和 rollback 的作用(简答)
- fetchone vs fetchall 的区别
- 5 步流程(顺序题)
- 什么时候要 commit(修改要、查询不要)
关键速记
① "导 → 连 → 游 → 执 → 关" —— 5 步流程
② "读不 commit,写必 commit" —— 何时提交
③ "try 执行 commit,except 写 rollback" —— 标准模板
④ "fetchone 一行,fetchall 全部" —— 查询方法
⑤ "提交才落盘,不提白干" —— commit 的意义
课堂综合测验
下列代码 缺少哪个关键步骤,会导致数据没有真正写入数据库?
cursor.execute("INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')")
cursor.close()
db.close()
cursor.fetchall()db.commit()cursor.execute()import mysql.connector✅ 答案:B
INSERT 修改了数据,但 没有 commit 就关闭连接 —— 修改只在缓冲区,不会真的存到数据库。
记住:"读不 commit,写必 commit"。INSERT/UPDATE/DELETE 都要 commit。
下列关于 fetchone() 和 fetchall() 的说法,错误 的是?
✅ 错的是:C
SELECT 是查询操作,没有修改数据,不需要 commit。
口诀:"读不 commit,写必 commit"。
Python 连接 MySQL 数据库的 5 步流程,正确顺序 是?
✅ 正确:B
速记:"导 → 连 → 游 → 执 → 关"
逻辑:先导入包(才能用),然后建立连接(先连上数据库),通过连接创建游标(游标是连接的"工具"),用游标执行 SQL,最后关闭。
下列关于 commit() 和 rollback() 的说法,正确 的是?
✅ 答案:C
分析:
A 错:commit 是 提交事务,关闭连接是 close()
B 错:rollback 通常是在 try-except 的 except 块里调用,撤销没 commit 成功的修改
C 对:rollback 让数据库回到 上一次 commit 后的状态
D 错:SELECT 是查询,没修改数据,不需要 rollback
🎓 整门课程结束!
到这一章,《数据库原理及应用教程(MySQL)》就讲完了。回顾你这一学期学到的:
- ✅ 数据库基础理论(关系模型、SQL 语言、视图)
- ✅ 数据库管理(安全管理、并发控制、备份还原)
- ✅ 数据库设计(需求分析、E-R 图、规范化、物理设计)
- ✅ 高级编程(存储过程、函数、触发器、事件)
- ✅ 实际应用(用 Python 连接 MySQL 开发)
这些知识 构成了一个完整的"造数据库 + 用数据库" 体系。无论你之后做 Web 开发、数据分析、还是后端工程,这些都是吃饭的本事。
① 期末复习:重点看必考点(每章都标了 ⭐),把口诀背熟
② 课后实战:找个真实项目(比如做个图书管理系统)从头到尾写一遍,把这本书每章都用上一次
③ 拓展学习:学完这本书,建议继续学 Redis、MongoDB(NoSQL)、Web 框架(Flask/Django)
🎉 恭喜你走到这里!期末考个好成绩 💪